package com.bw.module_login.vm

import android.util.Log
import androidx.lifecycle.viewModelScope
import com.bw.module_login.model.LoginRepository
import com.blankj.utilcode.util.LogUtils
import com.bw.lib_common.entity.UserEntity
import com.bw.lib_common.vm.BaseViewModel
import com.bw.lib_common.vm.BaseViewModel2
import com.bw.lib_database.database.entity.UserInfoEntity
import com.tencent.mmkv.MMKV
import kotlinx.coroutines.*

/**
 * 登录ViewModel
 */
class LoginViewModel: BaseViewModel2<LoginRepository>() {
    private val loginRepository = LoginRepository()

    /**
     * 登录到服务器
     */

    fun loginToServer(password:String,username:String){
        mViewModelScope.launch (mDispatcher){
            val result = mRepository.loginToServer(password, username)
            Log.d("TAG", "loginToServer: ${result.data}")
            if (result.code == 200){
                //使用postValue方法切换
                mSuccessLiveData.postValue(result.data)
                //保存Token
                MMKV.defaultMMKV().encode("token", result.data.token)
                MMKV.defaultMMKV().encode("userId", result.data.id)
                MMKV.defaultMMKV().encode("username",result.data.username)
                MMKV.defaultMMKV().encode("createTime",result.data.ctime)
                Log.d("TAG", "loginToServer: ${result.data.headImg}")
                //保存到数据库
                //saveUserInfo(result.data)
            } else {
                mErrorLiveData.postValue("登录失败！！")
            }
        }
//        viewModelScope.launch(Dispatchers.IO){
//            val result = loginRepository.loginToServer(password, username)
//            Log.d("TAG", "loginToServer: ${result.data}")
//            if (result.code == 200){
//                //使用postValue方法切换
//                mSuccessLiveData.postValue(result.data)
//                //保存Token
//                MMKV.defaultMMKV().encode("token", result.data.token)
//                MMKV.defaultMMKV().encode("userId", result.data.id)
//                Log.d("TAG", "loginToServer: ${result.data.headImg}")
//                //保存到数据库
//                //saveUserInfo(result.data)
//            } else {
//                mErrorLiveData.postValue("登录失败！！")
//            }
//        }
    }

    /**
     * 协程中如何处理异常
     * 方法1：try-catch
     * 方法2：自定义CoroutineExceptionHandler（协程异常处理类）
     * 方法3：SupervisorJob子协程创建独立作用域（采用的是独立协程作用域，异常对其他协程没有影响）
     */
    fun registerToServer(password:String,username:String){
        mViewModelScope.launch(mDispatcher){
            val result = mRepository.registerToServer(password, username)
            if (result.code == 200){
                //使用postValue方法切换
                mSuccessLiveData.postValue(result.data)
                //保存到数据库
                //saveUserInfo(result.data)
            } else {
                mErrorLiveData.postValue("注册失败！！")
            }
        }
//        viewModelScope.launch(Dispatchers.IO){
//            val result = loginRepository.registerToServer(password,username)
//            if (result.code == 200){
//                //使用postValue方法切换
//                mSuccessLiveData.postValue(result.data)
//                //保存到数据库
//                //saveUserInfo(result.data)
//            } else {
//                mErrorLiveData.postValue("注册失败！！")
//            }
//        }
    }
//    fun registerToServer(username: String, password: String){
//        mViewModelScope.launch{
//            val result = mRepository.registerToServer(username, password)
//            if (result.code == 200){
//                withContext(Dispatchers.Main){
//                    mSuccessLiveData.value = result.data
//                }
//            } else {
//                //使用WithContext切换协程上下文
//                withContext(Dispatchers.Main){
//                    mErrorLiveData.value = "注册失败！！"
//                }
//            }
//        }
//    }


    /**
     * 保存数据
     */
    private fun saveUserInfo(entity: UserEntity){
        viewModelScope.launch(Dispatchers.IO) {
            try {
                //封装数据库实体
                val userEntity = UserInfoEntity(
                    userId = entity.id,
                    cTime = entity.ctime,
                    isAuthor = entity.isAuthor,
                    password = entity.password,
                    userName = entity.username,
                )
                //执行插入数据库操作
                //mRepository.saveUserInfoToRoom(userEntity)
            }catch (e: Exception){
                LogUtils.e("异常：" + e.message)
            }finally {
                cancel()
            }
        }
    }

    override fun createRepository() = LoginRepository()

}